package com.hst.capacity.application.jpush.model.request;


import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;

@Setter
public class JPushAudience {

    //是否发送所有人
    private boolean isAll = false;
    //标签 OR  多个标签之间是 OR 的关系 一次推送最多 20 个tag
    private String[] tag;
    //标签 AND 多个标签之间是 AND 关系，即取交集 一次推送最多 20 个
    private String[] tagAnd;
    //标签 NOT 多个标签之间，先取多标签的并集，再对该结果取补集。 一次推送最多 20 个
    private String[] tagNot;
    //别名 多个别名之间是 OR 关系，即取并集。 一次推送最多 1000 个。 一个设备只能绑定一个别名，但多个设备可以绑定同一个别名。
    private String[] alias;
    //注册 ID 多个注册 ID 之间是 OR 关系，即取并集。 一次推送最多 1000 个
    private String[] registrationIds;
    //用户分群 ID 一次只能推送一个。
    private String[] segment;
    //A/B Test ID 一次只能推送一个。
    private String[] abtest;
    //实时活动标识 这种方式不能和其它audience方式组合使用，比如不允许（live_activity + tag 组合）
    private String liveActivityId;

    /**
     * 构建推送目标参数
     * @return
     */
    public JSONObject getParam(){
        JSONObject jsonObject=new JSONObject();

        //实时活动标识 是与其他条件互斥的
        if(StringUtils.isNotBlank(liveActivityId)){
            jsonObject.put("live_activity_id",liveActivityId);
        }else{
            if(isAll){
                jsonObject.put("all","all");
            }
            if(tag!=null&&tag.length>0){
                JSONArray jsonArray=new JSONArray();
                Arrays.stream(tag).forEach(jsonArray::add);
                jsonObject.put("tag",jsonArray);
            }
            if(tagAnd!=null&&tagAnd.length>0){
                JSONArray jsonArray=new JSONArray();
                Arrays.stream(tagAnd).forEach(jsonArray::add);
                jsonObject.put("tag_and",jsonArray);
            }
            if(tagNot!=null&&tagNot.length>0){
                JSONArray jsonArray=new JSONArray();
                Arrays.stream(tagNot).forEach(jsonArray::add);
                jsonObject.put("tag_not",jsonArray);
            }
            if(alias!=null&&alias.length>0){
                JSONArray jsonArray=new JSONArray();
                Arrays.stream(alias).forEach(jsonArray::add);
                jsonObject.put("alias",jsonArray);
            }
            if(registrationIds!=null&&registrationIds.length>0){
                JSONArray jsonArray=new JSONArray();
                Arrays.stream(registrationIds).forEach(jsonArray::add);
                jsonObject.put("registration_id",jsonArray);
            }
            if(segment!=null&&segment.length>0){
                JSONArray jsonArray=new JSONArray();
                Arrays.stream(segment).forEach(jsonArray::add);
                jsonObject.put("segment",jsonArray);
            }
            if(abtest!=null&&abtest.length>0){
                JSONArray jsonArray=new JSONArray();
                Arrays.stream(abtest).forEach(jsonArray::add);
                jsonObject.put("abtest",jsonArray);
            }
        }

        if(jsonObject.isEmpty()){
            return null;
        }

        JSONObject audience = new JSONObject();
        audience.put("audience",jsonObject);
        return audience;
    }

}
